package cn.android.support.v7.lib.sin.crown.dialog;

import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Build;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import cn.android.support.v7.lib.sin.crown.R;
import cn.android.support.v7.lib.sin.crown.base.BaseApplication;
import cn.android.support.v7.lib.sin.crown.base.BaseDialog;
import cn.android.support.v7.lib.sin.crown.base.BaseListenner;
import cn.android.support.v7.lib.sin.crown.utils.ProportionUtils;

import static android.view.View.SCROLLBARS_OUTSIDE_OVERLAY;


/**
 * H5启动界面
 * Created by 彭治铭 on 2017/5/21.
 */

public class H5Dailog extends BaseDialog {
    private static H5Dailog h5Dailog;
    private String url;
    private BaseListenner baseListenner;
    private boolean locked = false;//是否屏蔽按键【true 弹窗不会消失，false 弹窗会消失。 返回键H5会优先处理，H5处理完成，弹窗才会处理】
    private boolean auto = false;//弹窗是否自动消失

    /**
     * @param activity
     * @param mUrl           网址
     * @param mBaseListenner 弹框消失之后，回调函数
     * @param mLocked        true 弹窗不会消失(锁定屏蔽返回键)，false 弹窗会消失。 返回键H5会优先处理，H5处理完成，弹窗才会处理
     * @param mAuto          弹窗是否自动消失
     * @return
     */
    public static H5Dailog getInstance(Activity activity, String mUrl, BaseListenner mBaseListenner, boolean mLocked, boolean mAuto) {
        if (isfinish(activity,h5Dailog)) {
            h5Dailog = new H5Dailog(activity, mUrl, mBaseListenner, mLocked, mAuto);
        } else {
            h5Dailog.url = mUrl;
            h5Dailog.baseListenner = mBaseListenner;
        }
        return h5Dailog;
    }

    private WebView H5;

    private H5Dailog(Activity activity, String mUrl, BaseListenner mBaseListenner, boolean mLocked, boolean mAuto) {
        url = mUrl;
        baseListenner = mBaseListenner;
        locked = mLocked;
        auto = mAuto;
        init(activity, R.layout.crown_dialog_h5);
    }


    @Override
    protected void initUI() {
        H5 = (WebView) findViewById(R.id.crown_H5);
    }

    @Override
    protected void adapterUI() {
        ProportionUtils.getInstance().adapterScreen(activity, findViewById(R.id.crown_h5_dialog));
        ProportionUtils.getInstance().adapterScreen(activity, H5);

        //以下这三个属性确保百分比，保证webView背景变透明。【父容器背景记得也设置透明，之前因为这个问题以为没效果，瞎忙了一圈】
        //webView虽然背景透明了，但是页面加载的过程中，页面背景默认就是白色的。这个没法改变。
        H5.setBackground(null);
        H5.setBackgroundColor(Color.TRANSPARENT);
        //H5.setLayerType(View.LAYER_TYPE_SOFTWARE, null);//关闭硬件加速(默认是开启的)，确保背景透明有效。不关闭也没事，一般都有效。如果关闭了，视频会无法播放。所以建议开启。
        H5.setWebChromeClient(new WebChromeClient()); //（一定要加）
        //设置字符集编码
        H5.getSettings().setDefaultTextEncodingName("UTF-8");
        //开启JavaScript支持
        H5.getSettings().setJavaScriptEnabled(true);

        H5.getSettings().setUseWideViewPort(true);
        H5.getSettings().setLoadWithOverviewMode(true);
        H5.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
        H5.getSettings().setDomStorageEnabled(true);
        H5.setInitialScale(1);
        H5.getSettings().setLoadsImagesAutomatically(true);
        H5.loadData("<meta name=\"viewport\" content=\"width=device-width\">\n" +
                "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\">", "text/html", "UTF-8");

        //不支持缩放
        H5.getSettings().setSupportZoom(false);
        //取消滚动条
        H5.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
        //清除缓存
        H5.clearCache(true);
        //不从缓存中读取，仅从网络中读取
        H5.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        //继续在当前browser中响应
        H5.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // TODO Auto-generated method stub
                view.loadUrl(url);
                return true;
            }
        });
    }

    @Override
    protected boolean isAutoAdapterUI() {
        return false;
    }

    @Override
    protected boolean isStatus() {
        return true;
    }

    @Override
    protected boolean isTransparent() {
        return false;
    }

    @Override
    protected boolean isLocked() {
        return false;
    }

    @Override
    public void listener() {
        if (Build.VERSION.SDK_INT >= 19) {
            H5.loadUrl(url);//以防方一，一定要先适配webView的大小，再加载页面。
            if (auto) {
                H5.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (h5Dailog.dialog.isShowing()) {
                            dismiss();
                        }
                    }
                }, 3000);//启动页3秒后自动消失
            }
        } else {
            //防止配置或版本低的发生布局错误。对其进行延迟。
            //首次加载不要这样直接加载，防止出错。有了下面的延迟加载，这个就不要再调用了。两个都调用也容易出错。
            //加载页面【Activity首次加载，防止第一次无法正确加载页面。第一次建议延迟。】
            H5.postDelayed(new Runnable() {
                @Override
                public void run() {
                    H5.loadUrl(url);//以防方一，一定要先适配webView的大小，再加载页面。
                    if (auto) {
                        H5.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                if (h5Dailog.dialog.isShowing()) {
                                    dismiss();
                                }
                            }
                        }, 3000);//启动页3秒后自动消失
                    }
                }
            }, 100);//一般来说，好一点的机器65就可以了。但是为了兼容那些垃圾机器。100毫秒即可。延迟不要太大也不要太低。100左右刚刚好。
        }
        //Log.e("test","页面:\t"+url);
        //设置按键
        setOnKeyListener();
    }

    @Override
    protected void recycleView() {
        if (baseListenner != null) {
            baseListenner.onResult(null);
        }
    }


    //不屏蔽返回键，H5页面优先处理返回键。H5无返回时，则关闭弹窗。
    public void setOnKeyListener() {
        dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(final DialogInterface dialog, int keyCode, KeyEvent event) {
                //返回键，确认键，中间键
                //if ((keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER)
                //       && event.getAction() == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {  //表示按返回键时的操作
                    if (H5.canGoBack()) {
                        H5.goBack();//后退
                    } else {
                        if (!locked) {
                            dismiss();
                        }
                    }
                    return true;//记得返回true。表示已经处理。
                }
                return false;//返回键以外交给系统自行处理。
            }
        });
    }

    public static void setH5Dailog(H5Dailog h5Dailog) {
        H5Dailog.h5Dailog = h5Dailog;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setBaseListenner(BaseListenner baseListenner) {
        this.baseListenner = baseListenner;
    }

    public void setLocked(boolean locked) {
        this.locked = locked;
    }

    public void setAuto(boolean auto) {
        this.auto = auto;
    }

    public void setH5(WebView h5) {
        H5 = h5;
    }
}
